package com.lion.common.base.utils;

import com.google.gson.*;

import java.lang.reflect.Type;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

/**
 * @author Chris Chan
 * @date 2025/8/27 下午22:45
 * Use for:
 * Explain: 时间戳序列化器
 * 用于将 Instant 类型的时间戳转换为指定格式的字符串
 * 并在反序列化时将字符串转换为 Instant 类型
 */
public class InstantAdapter implements JsonSerializer<Instant>, JsonDeserializer<Instant> {
    // 统一格式
    private static final String pattern = "yyyy-MM-dd HH:mm:ss";
    // 定义时区偏移量
    private static final ZoneOffset zoneOffset = ZoneOffset.of("+8");

    @Override
    public JsonElement serialize(Instant instant, Type type, JsonSerializationContext context) {
        return new JsonPrimitive(instant
                .atOffset(zoneOffset)
                .format(DateTimeFormatter.ofPattern(pattern)));
    }

    @Override
    public Instant deserialize(JsonElement json, Type type, JsonDeserializationContext context)
            throws JsonParseException {
        // 定义格式化器，匹配你的字符串格式
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);

        // 先解析为 LocalDateTime
        LocalDateTime localDateTime = LocalDateTime.parse(json.getAsString(), formatter);

        // 转换为 Instant（需要指定时区）
        return localDateTime.atZone(zoneOffset).toInstant();
    }
}